// test_video_detail_api.js - 视频详情接口测试脚本
const axios = require('axios');
const fs = require('fs');
const path = require('path');

// 测试配置
const API_BASE_URL = 'http://localhost:3000/api';
const TEST_VIDEO_IDS = {
  VALID: 1, // 有效的视频ID，根据实际数据库调整
  INVALID: 'invalid_id',
  NON_EXISTENT: 999999 // 不存在的视频ID
};

// 测试结果记录
const testResults = {
  timestamp: new Date().toISOString(),
  tests: [],
  summary: { total: 0, passed: 0, failed: 0 }
};

// 记录测试结果
function recordResult(testName, success, message, data = null) {
  const result = {
    testName,
    success,
    message,
    data
  };
  
  testResults.tests.push(result);
  testResults.summary.total++;
  if (success) {
    testResults.summary.passed++;
  } else {
    testResults.summary.failed++;
  }
  
  console.log(`${success ? '✓ PASS' : '✗ FAIL'}: ${testName} - ${message}`);
}

// 保存测试结果
function saveResults() {
  const filePath = path.join(__dirname, 'video_detail_test_results.json');
  fs.writeFileSync(filePath, JSON.stringify(testResults, null, 2));
  console.log(`\n测试结果已保存到: ${filePath}`);
  console.log(`总结: 共 ${testResults.summary.total} 个测试, 通过 ${testResults.summary.passed} 个, 失败 ${testResults.summary.failed} 个`);
}

// 主测试函数
async function runTests() {
  console.log('开始测试视频详情接口...');
  
  try {
    // 1. 测试获取有效的视频详情
    try {
      const response = await axios.get(`${API_BASE_URL}/videos/${TEST_VIDEO_IDS.VALID}`);
      
      if (response.data.code === 200 && response.data.data) {
        // 验证返回的数据结构
        const hasRequiredFields = response.data.data.hasOwnProperty('id') &&
                                 response.data.data.hasOwnProperty('title') &&
                                 response.data.data.hasOwnProperty('video_url');
        
        if (hasRequiredFields) {
          recordResult('获取有效视频详情', true, '获取成功并包含必要字段', {
            videoId: response.data.data.id,
            title: response.data.data.title,
            viewCount: response.data.data.view_count
          });
        } else {
          recordResult('获取有效视频详情', false, '获取成功但缺少必要字段', response.data);
        }
      } else {
        recordResult('获取有效视频详情', false, '获取失败', response.data);
      }
    } catch (error) {
      recordResult('获取有效视频详情', false, '接口调用失败', error.response?.data || error.message);
    }
    
    // 2. 测试获取无效ID的视频详情
    try {
      const response = await axios.get(`${API_BASE_URL}/videos/${TEST_VIDEO_IDS.INVALID}`);
      
      if (response.data.code === 400) {
        recordResult('获取无效ID视频详情', true, '正确返回400错误', response.data);
      } else {
        recordResult('获取无效ID视频详情', false, '未返回预期的400错误', response.data);
      }
    } catch (error) {
      if (error.response && error.response.data.code === 400) {
        recordResult('获取无效ID视频详情', true, '正确返回400错误', error.response.data);
      } else {
        recordResult('获取无效ID视频详情', false, '错误类型不符预期', error.response?.data || error.message);
      }
    }
    
    // 3. 测试获取不存在的视频详情
    try {
      const response = await axios.get(`${API_BASE_URL}/videos/${TEST_VIDEO_IDS.NON_EXISTENT}`);
      
      if (response.data.code === 404) {
        recordResult('获取不存在视频详情', true, '正确返回404错误', response.data);
      } else {
        recordResult('获取不存在视频详情', false, '未返回预期的404错误', response.data);
      }
    } catch (error) {
      if (error.response && error.response.data.code === 404) {
        recordResult('获取不存在视频详情', true, '正确返回404错误', error.response.data);
      } else {
        recordResult('获取不存在视频详情', false, '错误类型不符预期', error.response?.data || error.message);
      }
    }
    
    // 4. 测试快速多次访问（观看次数增加测试）
    try {
      // 使用新的API直接从videos表获取初始观看次数
      const firstCountResponse = await axios.get(`${API_BASE_URL}/videos/${TEST_VIDEO_IDS.VALID}/view-count`);
      const initialViewCount = firstCountResponse.data.data?.view_count || 0;
      
      console.log(`\n初始观看次数: ${initialViewCount}`);
      
      // 访问视频详情，触发观看次数更新
      await axios.get(`${API_BASE_URL}/videos/${TEST_VIDEO_IDS.VALID}`);
      
      // 短暂等待数据库更新
      await new Promise(resolve => setTimeout(resolve, 500));
      
      // 再次使用新API获取更新后的观看次数
      const finalCountResponse = await axios.get(`${API_BASE_URL}/videos/${TEST_VIDEO_IDS.VALID}/view-count`);
      const finalViewCount = finalCountResponse.data.data?.view_count || 0;
      
      console.log(`最终观看次数: ${finalViewCount}`);
      
      if (finalViewCount > initialViewCount) {
        recordResult('测试观看次数增加', true, '观看次数成功增加', {
          initialViewCount,
          finalViewCount,
          increase: finalViewCount - initialViewCount
        });
      } else {
        recordResult('测试观看次数增加', false, '观看次数未增加', {
          initialViewCount,
          finalViewCount
        });
      }
    } catch (error) {
      recordResult('测试观看次数增加', false, '测试失败', error.response?.data || error.message);
    }
    
  } catch (error) {
    console.error('测试过程中发生未捕获的错误:', error);
    recordResult('全局错误', false, '测试过程中发生未捕获的错误', error.message);
  } finally {
    saveResults();
  }
}

// 执行测试
runTests();